home *** CD-ROM | disk | FTP | other *** search
/ HAM Radio 3.2 / Ham Radio Version 3.2 (Chestnut CD-ROMs)(1993).ISO / packet / n17jsrc / ttylink.c < prev    next >
C/C++ Source or Header  |  1991-02-07  |  3KB  |  120 lines

  1. /* Internet TTY "link" (keyboard chat) server
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  */
  4. #include <stdio.h>
  5. #include <time.h>
  6. #include "global.h"
  7. #include "mbuf.h"
  8. #include "socket.h"
  9. #include "telnet.h"
  10. #include "session.h"
  11. #include "proc.h"
  12. #include "tty.h"
  13. #include "mailbox.h"
  14. #include "commands.h"
  15.  
  16. static int Sttylink = -1;    /* Protoype socket for service */
  17. extern int Attended;
  18. static char Tnbanner[] = "Welcome to TTY-Link at %s - The system is %s.\n";
  19.  
  20. int
  21. ttylstart(argc,argv,p)
  22. int argc;
  23. char *argv[];
  24. void *p;
  25. {
  26.     struct sockaddr_in lsocket;
  27.     int s,type;
  28.  
  29.     if(Sttylink != -1){
  30.         return 0;
  31.     }
  32.     psignal(Curproc,0);    /* Don't keep the parser waiting */
  33.     chname(Curproc,"TTYlink listener");
  34.  
  35.     lsocket.sin_family = AF_INET;
  36.     lsocket.sin_addr.s_addr = INADDR_ANY;
  37.     if(argc < 2)
  38.         lsocket.sin_port = IPPORT_TTYLINK;
  39.     else
  40.         lsocket.sin_port = atoi(argv[1]);
  41.  
  42.     Sttylink = socket(AF_INET,SOCK_STREAM,0);
  43.     bind(Sttylink,(char *)&lsocket,sizeof(lsocket));
  44.     listen(Sttylink,1);
  45.     for(;;){
  46.         if((s = accept(Sttylink,NULLCHAR,(int *)NULL)) == -1)
  47.             break;    /* Service is shutting down */
  48.         
  49.         if(availmem() < Memthresh){
  50.             usprintf(s,"System is overloaded; try again later\r\n");
  51.             shutdown(s,1);
  52.         } else {
  53.             type = TELNET;
  54.             newproc("chat",2048,ttylhandle,s,(void *)&type,NULL,0);
  55.         }
  56.     }
  57.     return 0;
  58. }
  59. /* This function handles all incoming "chat" sessions, be they TCP,
  60.  * NET/ROM or AX.25
  61.  */
  62. void
  63. ttylhandle(s,t,p)
  64. int s;
  65. void *t;
  66. void *p;
  67. {
  68.     int type,index;
  69.     struct session *sp;
  70.     char addr[MAXSOCKSIZE];
  71.     int len = MAXSOCKSIZE;
  72.     struct telnet tn;
  73.     extern char *Motd;
  74.     time_t nowtime;
  75.  
  76.     type = * (int *)t;
  77.     sockmode(s,SOCK_ASCII);
  78.     sockowner(s,Curproc);    /* We own it now */
  79.     log(s,"open %s",Sestypes[type]);
  80.  
  81.     /* Allocate a session descriptor */
  82.     if((sp = newsession(NULLCHAR,type,1)) == NULLSESSION){
  83.         usprintf(s,"Too many sessions\n");
  84.         close_s(s);
  85.         return;
  86.     }
  87.     index = sp - Sessions;
  88.  
  89.     /* Initialize a Telnet protocol descriptor */
  90.     memset((char *)&tn,0,sizeof(tn));
  91.     tn.session = sp;    /* Upward pointer */
  92.     sp->cb.telnet = &tn;    /* Downward pointer */
  93.     sp->s = s;
  94.     sp->proc = Curproc;
  95.  
  96.     time(&nowtime);        /* current time */
  97.  
  98.     getpeername(s,addr,&len);
  99.     tprintf("\007Incoming %s session %u from %s on %s",
  100.      Sestypes[type],index,psocket(addr),ctime(&nowtime));
  101.  
  102.     usprintf(s, Tnbanner, Hostname, Attended ? "attended" : "unattended");
  103.     if(Motd != NULLCHAR)
  104.         usprintf(s, "%s", Motd);
  105.  
  106.     tnrecv(&tn);
  107. }
  108.  
  109. /* Shut down Ttylink server */
  110. int
  111. ttyl0(argc,argv,p)
  112. int argc;
  113. char *argv[];
  114. void *p;
  115. {
  116.     close_s(Sttylink);
  117.     Sttylink = -1;
  118.     return 0;
  119. }
  120.